/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import java.util.ArrayList;
import negocio.Jogador;

/**
 *
 * @author jessica.rodrigues
 */
public final class JogadorDAO extends DAO {
        private final int INDEX_NOME = 1;
        private final int INDEX_LOGIN = 2;
        private final int INDEX_PASSWORD = 3;
        private final int INDEX_SCORE = 4;
        private final int INDEX_PERMISSAO = 5;
        private ArrayList<Jogador> list;

        public JogadorDAO() {	    
            super(Thread.currentThread().getContextClassLoader().getResource("data//jogador.csv").getPath());
        }

        private Jogador dataToJogador(String[] data) {
                Jogador jogador = new Jogador();
                jogador.setCodigo(Integer.parseInt(data[INDEX_KEY]));
                jogador.setNome(data[INDEX_NOME]);
                jogador.setLogin(data[INDEX_LOGIN]);
                jogador.setPassword(data[INDEX_PASSWORD]);
                jogador.setScore(Integer.parseInt(data[INDEX_SCORE]));
                String permissaoLista[] = data[INDEX_PERMISSAO].split("\\|");
                for (int i = 0; i < permissaoLista.length; i++) {
                        jogador.permissao.addPermissao(Integer.parseInt(permissaoLista[i]));
                }

                return jogador;
        }

        public ArrayList<Jogador> getList() {
                ArrayList<Jogador> list = new ArrayList<Jogador>();

                for(String[] data : this.getListString()) {
                        list.add(this.dataToJogador(data));
                }

                return list;
        }

        public Jogador getByLogin(String login) {
                for(String[] data : this.getListString()) {
                        if (data[INDEX_LOGIN].equals(login)) {
                                return this.dataToJogador(data);
                        }
                }
                
                return null;
        }
        
        public void removeByLogin(String login) {
                this.remove(login, INDEX_LOGIN);
        }
        
        public void valid(Jogador jogador) throws Exception {
                Jogador jogadorExistente = this.getByLogin(jogador.getLogin());
                if(jogadorExistente != null && jogadorExistente.getCodigo() != jogador.getCodigo()) {
                        throw new Exception("O login escolhido já está sendo utilizado.");
                }
        }

        public void store(Jogador jogador) throws Exception {
                this.valid(jogador);
                
                String data[] = new String[6];

                int codigo = jogador.getCodigo();
                data[INDEX_KEY] = Integer.toString(codigo == 0 ? this.getNextCodigo() : codigo);
                data[INDEX_NOME] = jogador.getNome();
                data[INDEX_LOGIN] = jogador.getLogin();
                data[INDEX_PASSWORD] = jogador.getPassword();
                data[INDEX_SCORE] = Integer.toString(jogador.getScore());
                StringBuilder builder = new StringBuilder();
                Integer[] permissaoLista = jogador.permissao.toArray();
                builder.append(permissaoLista[0]);
                for(int i = 1; i < permissaoLista.length; i++) {
                        builder.append('|');
                        builder.append(permissaoLista[i]);
                }
                data[INDEX_PERMISSAO] = builder.toString();

                this.store(data);
        }
        
        @Override
        protected int getNextCodigo() {
                ArrayList<String[]> listString = this.getListString();
                System.out.println();
                return Integer.parseInt(listString.get(listString.size() - 1)[INDEX_KEY]) + 1;
        }
}